
import { EventConfig } from "./EventConfig";
import * as cc from 'cc';
/** 事件名 */
type EVENT_TYPE = keyof typeof EventConfig;
/** 类泛型 */
type Class<T = unknown> = new (...args: any[]) => T;
/**
 * 游戏事件管理类
 * @author 神兽白泽
 * @description 交流群：415468592
 */
export default class EventMgr {
    /**
    * 初始化 全局事件
    */
    public static init() {
        // 后台切前台事件
        cc.game.on(cc.Game.EVENT_SHOW, () => {
            console.log("重新返回游戏");
            this.emit("OnShow");
        }, this);
    }

    /** 监听列表 */
    private static listeners: Map<EVENT_TYPE, Map<object, Function>> = new Map();// object是类的对象
    
    /** 
     * 注册事件
     * @param event_name 事件名称
     * @param event_func 回调函数
     * @param event_target 类
     */
    public static on(event_name: EVENT_TYPE, event_func: Function, event_target: object) {
        if (!this.listeners.get(event_name)) this.listeners.set(event_name, new Map());
        this.listeners.get(event_name).set(event_target, event_func);
    }

    /**
     * 移除事件
     * @param event_name 事件名称
     * @param event_target 上下文
     */
    public static off(event_name: EVENT_TYPE, event_target: object) {
        if (!this.listeners.get(event_name)) return;
        this.listeners.get(event_name).delete(event_target);// 移除类对指定事件的监听
    }

    /**
     * 移除目标所有事件所有
     * @param event_target 类
     */
    public static offAll(event_target: object) {
        this.listeners.forEach((_map, event_name) => { this.off(event_name, event_target); })
    }

    /**
     * 发送事件
     * @param event_name 事件名称
     */
    public static emit(event_name: EVENT_TYPE, ...args: any[]) {
        if (!this.listeners.get(event_name)) return;
        this.listeners.get(event_name).forEach((_func, _target) => { _func.call(_target, event_name, ...args); })
    }

}
EventMgr.init();